<?php

namespace Fize\Third\XiaoMi\EMI4;

use Fize\Http\ClientOnce;
use InvalidArgumentException;

/**
 * 事件回传
 */
class Event
{

    protected $secret_key;

    /**
     * @param string $secret_key 资产秘钥
     */
    public function __construct(string $secret_key)
    {
        $this->secret_key = $secret_key;
    }

    /**
     * 精准API
     * @see https://wtnoyf46ow.feishu.cn/docx/V4CrdxlSXooR66xHIKRckVjAnyg
     * @param string|null       $oaid       匿名设备标识符
     * @param string|null       $imei       国际移动设备识别码
     * @param string|null       $ip         网络协议地址
     * @param string|null       $ua         用户代理（浏览器标识）
     * @param string            $carrier_id 载体id
     * @param int               $capital_id 资产id
     * @param string            $event      事件
     * @param int               $event_time 事件发生时间，毫秒级时间戳。
     * @param string|array|null $properties 附加属性
     * @param string|null       $callback   归因回调参数
     * @param int               $is_debug   联调标识符
     * @return array
     */
    public function exact(?string $oaid, ?string $imei, ?string $ip, ?string $ua, string $carrier_id, int $capital_id, string $event, int $event_time, $properties = null, string $callback = null, int $is_debug = 0): array
    {
        if (is_null($oaid) && is_null($imei) && is_null($ip)) {
            throw new InvalidArgumentException('参数错误：需上报oaid、imei、ip&ua 三者中其一。');
        }
        if (is_null($oaid) && is_null($imei) && is_null($ua)) {
            throw new InvalidArgumentException('参数错误：ip和ua必须同时上报。');
        }
        $querys = [];
        if (!is_null($oaid)) {
            $querys['oaid'] = $oaid;
        }
        if (!is_null($imei)) {
            $querys['imei'] = $imei;
        }
        if (!is_null($ip)) {
            $querys['ip'] = $ip;
        }
        if (!is_null($ua)) {
            $querys['ua'] = $ua;
        }
        $querys['carrier_id'] = $carrier_id;
        $querys['capital_id'] = $capital_id;
        $querys['event'] = $event;
        $querys['event_time'] = $event_time;
        if (!is_null($properties)) {
            if (is_array($properties)) {
                $properties = json_encode($properties);
            }
            $querys['properties'] = $properties;
        }
        if (!is_null($callback)) {
            $querys['callback'] = $callback;
        }
        $querys['is_debug'] = $is_debug;

        // 签名
        $query = http_build_query($querys);
        $query1 = $query . "&secret_key={$this->secret_key}";
        $sign = md5($query1);
        $query .= "&sign={$sign}";

        $url = "https://trail.e.mi.com/v4/api/exact?{$query}";
        $response = ClientOnce::get($url);
        $content = $response->getBody()->getContents();
        return json_decode($content, true);
    }

    /**
     * 非精准API
     * @see https://wtnoyf46ow.feishu.cn/docx/V4CrdxlSXooR66xHIKRckVjAnyg
     * @param string            $channel_type      渠道类型
     * @param string|null       $channel           渠道
     * @param int               $is_joint_modeling 人群联合建模标识
     * @param string|null       $oaid              匿名设备标识符
     * @param string|null       $imei              国际移动设备识别码
     * @param string|null       $ip                网络协议地址
     * @param string|null       $ua                用户代理（浏览器标识）
     * @param string            $carrier_id        载体id
     * @param int               $capital_id        资产id
     * @param string            $event             事件
     * @param int               $event_time        事件发生时间，毫秒级时间戳。
     * @param string|array|null $properties        附加属性
     * @param string|null       $callback          归因回调参数
     * @param int               $is_debug          联调标识符
     * @return array
     */
    public function inexact(string $channel_type, ?string $channel, int $is_joint_modeling, ?string $oaid, ?string $imei, ?string $ip, ?string $ua, string $carrier_id, int $capital_id, string $event, int $event_time, $properties = null, string $callback = null, int $is_debug = 0): array
    {
        if (is_null($oaid) && is_null($imei) && is_null($ip)) {
            throw new InvalidArgumentException('参数错误：需上报oaid、imei、ip&ua 三者中其一。');
        }
        if (is_null($oaid) && is_null($imei) && is_null($ua)) {
            throw new InvalidArgumentException('参数错误：ip和ua必须同时上报。');
        }
        $querys = [];
        $querys['channel_type'] = $channel_type;
        if (!is_null($channel)) {
            $querys['channel'] = $channel;
        }
        $querys['is_joint_modeling'] = $is_joint_modeling;
        if (!is_null($oaid)) {
            $querys['oaid'] = $oaid;
        }
        if (!is_null($imei)) {
            $querys['imei'] = $imei;
        }
        if (!is_null($ip)) {
            $querys['ip'] = $ip;
        }
        if (!is_null($ua)) {
            $querys['ua'] = $ua;
        }
        $querys['carrier_id'] = $carrier_id;
        $querys['capital_id'] = $capital_id;
        $querys['event'] = $event;
        $querys['event_time'] = $event_time;
        if (!is_null($properties)) {
            if (is_array($properties)) {
                $properties = json_encode($properties);
            }
            $querys['properties'] = $properties;
        }
        if (!is_null($callback)) {
            $querys['callback'] = $callback;
        }
        $querys['is_debug'] = $is_debug;

        // 签名
        $query = http_build_query($querys);
        $query1 = $query . "&secret_key={$this->secret_key}";
        $sign = md5($query1);
        $query .= "&sign={$sign}";

        $url = "https://trail.e.mi.com/v4/api/inexact?{$query}";
        $response = ClientOnce::get($url);
        $content = $response->getBody()->getContents();
        return json_decode($content, true);
    }

    /**
     * 线索API
     * @see https://wtnoyf46ow.feishu.cn/docx/AQMTd23HzosMBCxvjksc6HoLnNc
     * @param int    $capitalId        资产id
     * @param string $event            事件
     * @param string $eventType        事件类型
     * @param int    $clientTime       事件发生时间，毫秒级时间戳。
     * @param string $logExtra         归因回调参数
     * @param bool   $conversion_debug 联调标识符
     * @return array
     */
    public function conversionLog(int $capitalId, string $event, string $eventType, int $clientTime, string $logExtra, bool $conversion_debug = false): array
    {
        $querys = [
            'capitalId'  => $capitalId,
            'event'      => $event,
            'eventType'  => $eventType,
            'clientTime' => $clientTime,
            'logExtra'   => $logExtra,
        ];
        if ($conversion_debug) {
            $querys['conversion_debug'] = 'true';
        }
        $query = http_build_query($querys);
        $url = "https://site.e.mi.com/conversionLog?{$query}";
        $response = ClientOnce::get($url);
        $content = $response->getBody()->getContents();
        return json_decode($content, true);
    }
}